/*
1. 交集 & 
> 交叉类型, 使用 & 取交集,交集拥有更多属性
> 如果确定没有交集，就会得到 never
> 对象属性合并,得到拥有更多属性的对象
> never 与任何类型取交集都得到 never
2. 并集 | 
> 要么a，要么 b , 只能有一个， 属性会减少

*/

//-------------交集，同时拥有两个属性-------------------
interface Person1 {
    handsome: string
}
interface Person2 {
    high: string
}

type Person3 = Person1 & Person2
let p: Person3 = {
    handsome: '帅啊',
    high: '高啊'
}

// ---------交集取不到，得到 never --------------------
interface Person4 {
    name: string
}
interface Person5 {
    name: number
}
type Person6 = Person4 & Person5
// never 型
function fn(): never {
    throw new Error('')
}
// 同时拥有 string 和 number 两种类型的 name 属性，肯定得到 never 
let p2: Person6 = { name: fn() }


// -----------对象属性合并,得到拥有更多属性的对象-----------------
// function mixin<T, K>(obj1: T, obj2: K): T & K {
function mixin<T extends object, K extends object>(obj1: T, obj2: K): T & K {
    return { ...obj1, ...obj2 }
}
let m = mixin({ a: '323' }, { b: 212 })
let m2 = mixin('erer', { b: 212 })


//----------------- never 与任何类型取交集都得到 never------------------------------
type ms = string & never  // never

export { }

